package com.baofu.trade.model;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;

@Data
public class KlineData {
    private static final ZoneId BEIJING_ZONE = ZoneId.of("Asia/Shanghai");
    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    /**
     * K线开盘时间
     * 以毫秒为单位的Unix时间戳
     */
    @JsonProperty("开盘时间戳")
    private Long openTime;

    /**
     * K线开盘时间（北京时间）
     * 格式：yyyy-MM-dd HH:mm:ss
     */
    @JsonProperty("开盘时间")
    private String openTimeBeijing;

    /**
     * 开盘价格
     * 这根K线期间的第一笔成交价
     */
    @JsonProperty("开盘价")
    private String open;

    /**
     * 最高价格
     * 这根K线期间的最高成交价
     */
    @JsonProperty("最高价")
    private String high;

    /**
     * 最低价格
     * 这根K线期间的最低成交价
     */
    @JsonProperty("最低价")
    private String low;

    /**
     * 收盘价格
     * 这根K线期间的最后一笔成交价
     */
    @JsonProperty("收盘价")
    private String close;

    /**
     * 成交量
     * 这根K线期间的成交量（以基础货币计量，如BTC）
     */
    @JsonProperty("成交量")
    private String volume;

    /**
     * K线收盘时间
     * 以毫秒为单位的Unix时间戳
     */
    @JsonProperty("收盘时间戳")
    private Long closeTime;

    /**
     * K线收盘时间（北京时间）
     * 格式：yyyy-MM-dd HH:mm:ss
     */
    @JsonProperty("收盘时间")
    private String closeTimeBeijing;

    /**
     * 成交额
     * 这根K线期间的成交额（以计价货币计量，如USDT）
     */
    @JsonProperty("成交额")
    private String quoteAssetVolume;

    /**
     * 成交笔数
     * 这根K线期间的成交总笔数
     */
    @JsonProperty("成交笔数")
    private Long numberOfTrades;

    /**
     * 主动买入成交量
     * 主动买入的成交量（以基础货币计量，如BTC）
     */
    @JsonProperty("主动买入成交量")
    private String takerBuyBaseAssetVolume;

    /**
     * 主动买入成交额
     * 主动买入的成交额（以计价货币计量，如USDT）
     */
    @JsonProperty("主动买入成交额")
    private String takerBuyQuoteAssetVolume;

    /**
     * 设置开盘时间并自动转换为北京时间
     */
    public void setOpenTime(Long openTime) {
        this.openTime = openTime;
        if (openTime != null) {
            this.openTimeBeijing = LocalDateTime.ofInstant(
                Instant.ofEpochMilli(openTime), 
                BEIJING_ZONE
            ).format(DATE_FORMATTER);
        }
    }

    /**
     * 设置收盘时间并自动转换为北京时间
     */
    public void setCloseTime(Long closeTime) {
        this.closeTime = closeTime;
        if (closeTime != null) {
            this.closeTimeBeijing = LocalDateTime.ofInstant(
                Instant.ofEpochMilli(closeTime), 
                BEIJING_ZONE
            ).format(DATE_FORMATTER);
        }
    }
} 